package ojt.model;

import java.util.regex.Pattern;

import ojt.exception.BusinessException;
import ojt.util.Validater;



/**
 * 社員情報モデルクラス
 * @author kenta
 *
 */
public class Shain {
	//社員番号
	public String shain_no;
	//パスワード
	public String password;
	//パスワード（確認）
	public String password_conf;
	//姓
	public String first_name;
	//名
	public String last_name;
	//性別
	public String sex;
	//部門コード
	public String section_code;
	//入社年月日
	public String enter_date;
	//メールアドレス
	public String e_mail;

	//検索用の入社年月日
	public String enter_date_from;
	public String enter_date_to;

	/**
	 * コンストラクタ
	 */
	public Shain(){
	}

	/**
	 *
	 * ログイン時チェックメソッド
	 * ログイン画面での入力パラメータのチェックを行う。
	 * 社員番号、パスワードのどちらか、あるいは両方が未入力の場合、業務例外をスローする。
	 * @throws BusinessException 未入力の項目があります
	 */
	public void checkLoginInput() throws BusinessException{
		//nullか未入力だったらエラー
		if(	this.shain_no == null 	|| this.shain_no.equals("") ||
			this.password == null 	|| this.password.equals("")
			)
		{throw new BusinessException("未入力の項目があります");
		}
	}

	/**
	 * 登録確認入力時チェックメソッド
	 * @throws BusinessException エラー種別に応じたエラーメッセージ
	 */
	public void checkNewInput() throws BusinessException{
		BusinessException be = new BusinessException();
		//未入力チェック:nullか未入力だったらエラー
		if(	this.shain_no == null		|| this.shain_no.equals("") 	||
			this.password == null		|| this.password.equals("") 	||
			this.password_conf == null	|| this.password_conf.equals("")||
			this.first_name == null		|| this.first_name.equals("")	||
			this.last_name == null		|| this.last_name.equals("")	||
			this.sex == null			|| this.sex.equals("")			||
			this.enter_date == null		|| this.enter_date.equals("")	||
			this.section_code == null	|| this.section_code.equals(""))
		{
			be.setErrorMessage("未入力の項目があります");
			throw be;
		}
		//形式チェック：社員番号
		if(!Pattern.matches("[0-9]{5}", this.shain_no)){
			be.setErrorMessage("形式が間違っています：社員番号");
			throw be;
		}
		//形式チェック：パスワード
		if(!Pattern.matches("\\p{ASCII}*", this.password)){
			be.setErrorMessage("形式が間違っています：パスワード");
			throw be;
		}
		//相関チェック：パスワードとパスワード（確認）が一致
		if(!this.password.equals(this.password_conf)){
			be.setErrorMessage("パスワードが一致しません");
			throw be;
		}
		//形式チェック：姓
		if(!Pattern.matches("[\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}]{1,10}", this.first_name)){
			be.setErrorMessage("形式が間違っています：姓");
			throw be;
		}
		//形式チェック：名
		if(!Pattern.matches("[\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}]{1,10}", this.last_name)){
			be.setErrorMessage("形式が間違っています：名");
			throw be;
		}
		//形式チェック：性別
		if(!Pattern.matches("[0-1]", this.sex)){
			be.setErrorMessage("形式が間違っています：性別");
			throw be;
		}
		//形式チェック：入社年月日
		if(!Validater.checkDate(enter_date)){
			be.setErrorMessage("形式が間違っています：入社年月日");
			throw be;
		}
		//形式チェック：部門コード
		//if(!Pattern.matches("[1-3][1-3]00", this.section_code)){
		if(!Pattern.matches("(BS|SS|ES)[1-4]G", this.section_code)){
			be.setErrorMessage("形式が間違っています：部門");
			throw be;
		}
		//形式チェック：メールアドレス
		if(this.e_mail != null && this.e_mail.equals("") == false){
			if(!Validater.checkE_Mail(e_mail)){
				be.setErrorMessage("形式が間違っています：メールアドレス");
				throw be;
			}
		}
	}

	/**
	 * 検索時チェックメソッド
	 * @throws BusinessException 入力エラー
	 */
	public void checkSearchInput() throws BusinessException{
		//業務例外
		BusinessException be = new BusinessException();

		//nullチェック
		if(	this.shain_no == null 			||
			this.sex == null				||
			this.section_code == null 		||
			this.enter_date_from == null	||
			this.enter_date_from == null)
		{
			be.setErrorMessage("不正な操作が行われました");
			throw be;
		}

		//パラメータが入力されていれば、形式チェックを行う
		// 形式チェック：社員番号
		if(this.shain_no.equals("") != true && !Pattern.matches("[0-9]{5}", this.shain_no)){
			be.setErrorMessage("形式が間違っています：社員番号");
			throw be;
		}
		//形式チェック：性別
		if(this.sex.equals("") != true && !Pattern.matches("[0-1]", this.sex)){
			be.setErrorMessage("形式が間違っています：性別");
			throw be;
		}
		//形式チェック：部門コード
		if(this.section_code.equals("") != true && !Pattern.matches("(BS|SS|ES)[1-4]G", this.section_code)){
			be.setErrorMessage("形式が間違っています：部門");
			throw be;
		}
		//形式チェック：入社年月日(From)
		if(this.enter_date_from.equals("") != true &&!Validater.checkDate(enter_date_from)){
			be.setErrorMessage("形式が間違っています：入社年月日(From)");
			throw be;
		}
		//形式チェック：入社年月日(To)
		if(this.enter_date_to.equals("") != true &&!Validater.checkDate(enter_date_to)){
			be.setErrorMessage("形式が間違っています：入社年月日(To)");
			throw be;
		}
		//相関チェック：入社年月日(From) <= 入社年月日(To)
		if(this.enter_date_from.equals("") != true && this.enter_date_to.equals("") != true){
			if(Integer.parseInt(this.enter_date_from) > Integer.parseInt(this.enter_date_to)){
				be.setErrorMessage("入社年月日(From)が入社年月日(To)より大きいです");
				throw be;
			}
		}
	}

	/**
	 * 更新入力時チェックメソッド
	 * 新規登録のチェックメソッドからパスワードのチェックを省いたもの
	 * @throws BusinessException 入力エラーがあります
	 */
	public void checkUpdateInput() throws BusinessException{
		BusinessException be = new BusinessException();
		//未入力チェック:nullか未入力だったらエラー
		if(	this.shain_no == null     || this.shain_no.equals("") 	||
			this.first_name == null   || this.first_name.equals("")	||
			this.last_name == null    || this.last_name.equals("")	||
			this.sex == null          || this.sex.equals("")		||
			this.enter_date == null   || this.enter_date.equals("")	||
			this.section_code == null || this.section_code.equals(""))
		{
			be.setErrorMessage("未入力の項目があります");
			throw be;
		}
		//形式チェック：社員番号
		if(!Pattern.matches("[0-9]{5}", this.shain_no)){
			be.setErrorMessage("形式が間違っています：社員番号");
			throw be;
		}
		//形式チェック：姓
		if(!Pattern.matches("[\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}]{1,10}", this.first_name)){
			be.setErrorMessage("形式が間違っています：姓");
			throw be;
		}
		//形式チェック：名
		if(!Pattern.matches("[\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}]{1,10}", this.last_name)){
			be.setErrorMessage("形式が間違っています：名");
			throw be;
		}
		//形式チェック：性別
		if(!Pattern.matches("[0-1]", this.sex)){
			be.setErrorMessage("形式が間違っています：性別");
			throw be;
		}
		//形式チェック：入社年月日
		if(!Validater.checkDate(enter_date)){
			be.setErrorMessage("形式が間違っています：入社年月日");
			throw be;
		}
		//形式チェック：部門コード
		if(!Pattern.matches("(BS|SS|ES)[1-4]G", this.section_code)){
			be.setErrorMessage("形式が間違っています：部門");
			throw be;
		}
		//形式チェック：メールアドレス
		if(this.e_mail != null && this.e_mail.equals("") == false){
			if(!Validater.checkE_Mail(e_mail)){
				be.setErrorMessage("形式が間違っています：メールアドレス");
				throw be;
			}
		}
	}
}